#include "Hardware/1-wire.h"
#include "Device/DS18B20.h"
#include "Hardware/Timer.h"

//工作步骤:
/*1.每一次读写之前都要对DS18B20 进行复位操作
 *2.复位成功后发送一条ROM 指令
 *3.最后发送RAM 指令
 */

 /*datasheet明确写了,你开始转换的命令成功结束后,你需要足够多的时间让它检测转换当前温度,时间是几百个毫秒,也就是0.几秒,最大12方式时甚至要750ms,我看到85就知道这个是默认上电时读到的寄存器初始值,也就是说还没有转换得到第一个温度数据.你以后正常实际上每次读的都是前500毫秒的温度.
  *
  */
 
#define ControlRom  (0xcc) //跳跃ROM指令(Skit Rom),只有一个设备时可用
#define TempConvert (0x44) //温度转换指令
#define ReadTemp    (0xbe) //读取温度指令,2个字节共

void DS18B20_Init()
{
	DS18B20_GetCelsius();
	Delay(1000);
	DS18B20_GetCelsius();
}

//处理数据
float DS18B20_DealData(byte high,byte low)
{
	int16 res= ((int16)high)<<8 | low;
	return res*0.0625f;	
}


float DS18B20_GetCelsius()
{
	byte low,high;
	
	//先请求转换温度
	if(WireReset()==false)
		return 0;
	WireSendByte(ControlRom);
	WireSendByte(TempConvert);
	
	//请求读数据
	if(WireReset()==false)
		return 0;
	WireSendByte(ControlRom);
	WireSendByte(ReadTemp);
	
	//因为数据和命令都是从低位发来,所以先读出来的是低位字节,然后才是高位字节
	low=WireRecvByte();
	high=WireRecvByte();
	
	return DS18B20_DealData(high,low);
}

float DS18B20_GetFahrenheit()
{
	return DS18B20_GetCelsius()*1.8+32;
}